import parseAttrsString from "./parseAttrsString"

//parse函数: 将模板字符串编译成AST
export default function parse(templateStr) {
  //指针
  let index = 0

  //剩余字符串
  let rest = templateStr

  //用来检测 不同标记 的正则表达式
  let startTagRegExp = /^<(\w+)\s?([^<>]*)>/
  let endTagRegExp = /^<\/(\w+)>/
  let textRegExp = /^([^<>]+)/

  //最终的结果
  let result

  //栈 
  let stack = []

  //遍历模板字符串
  while (index < templateStr.length - 1) {
    //console.log(stack[stack.length - 1])

    //判断是否是以 开始标签 开头
    if (startTagRegExp.test(rest)) {

      //匹配 开始标签 
      let res = rest.match(startTagRegExp)

      //console.log('检测到开始标签 ' + res[0])
      //console.log('检测到attrs ' + res[2])

      //解析attrs
      let attrsArray = parseAttrsString(res[2].trim())

      //入栈
      stack.push({
        tag: res[1],
        type: 1,
        attrs: attrsArray,
        children: []
      })

      //移动指针
      index += res[0].length
    } else if (endTagRegExp.test(rest)) {
      //判断是否是以 结束标签 开头

      //匹配 结束标签 
      let res = rest.match(endTagRegExp)

      //console.log('检测到结束标签 ' + res[0])

      //弹栈
      let pop_obj = stack.pop()

      if (stack.length > 0) {
        stack[stack.length - 1].children.push(pop_obj)
      } else {
        result = pop_obj
      }

      //移动指针
      index += res[0].length
    } else if (textRegExp.test(rest)) {
      //判断是否是一个 文本 开头

      //匹配 文本 
      let res = rest.match(textRegExp)
      let text = res[1].trim()

      if (text.length > 0) {
        //console.log('检测到内容 ' + text)

        //将 非空文本 入栈顶
        stack[stack.length - 1].children.push({
          'text': text,
          'type': 3
        })
      }

      //移动指针
      index += res[0].length
    } else {
      index++
    }

    //更新剩余字符串
    rest = templateStr.substring(index)
  }

  return result
}

